#include <iostream>

// 单例模式：只能实例化一个对象，构造函数和拷贝构造私有化
// 饿汉
// 程序启动时就创建对象，无论是否需要
// namespace hunger
// {
//     class Singleton
//     {
//     private:
//         Singleton()
//         {
//         }

//         Singleton(int a, int b, int c)
//             : _a(a), _b(b), _c(c)
//         {
//         }

//         Singleton(const Singleton &sint) = delete;
//         Singleton &operator=(const Singleton &sint) = delete;

//         ~Singleton()
//         {
//         }

//     private:
//         int _a;
//         int _b;
//         int _c;

//         static Singleton _sint; // 静态成员变量属于类本身而非类的对象，整个程序运行期间只有一份
//     public:
//         static Singleton *GetInstance()
//         {
//             return &_sint;
//         }

//         void Print()
//         {
//             std::cout << _a << std::endl;
//             std::cout << _b << std::endl;
//             std::cout << _c << std::endl;
//         }
//     };
//     Singleton Singleton::_sint(1,2,3);
// }

namespace hunger
{
    class Singleton
    {
    private:
        Singleton()
        {
        }

        Singleton(int a, int b, int c)
            : _a(a), _b(b), _c(c)
        {
        }

        Singleton(const Singleton &sint) = delete;
        Singleton &operator=(const Singleton &sint) = delete;

        ~Singleton()
        {
        }

    private:
        int _a;
        int _b;
        int _c;

        static Singleton _sint; // 静态成员变量属于类本身而非类的对象，整个程序运行期间只有一份
    public:
        static Singleton &GetInstance()
        {
            return _sint;
        }

        void Print()
        {
            std::cout << _a << std::endl;
            std::cout << _b << std::endl;
            std::cout << _c << std::endl;
        }
    };
    Singleton Singleton::_sint(1, 2, 3);
}


namespace lazy
{
    class Singleton
    {
    private:
        // Singleton()
        // {}

        Singleton(int a,int b,int c)
        :_a(a),_b(b),_c(c)
        {}

        ~Singleton()
        {}

    private:
        int _a;
        int _b;
        int _c;

        static Singleton* _sint;

    public:
        static Singleton* GetInstance()
        {
            if(nullptr==_sint)
            {
                _sint=new Singleton(1,2,3);
            }
            return _sint;
        }

        void Print()
        {
            std::cout<<_a<<" "<<_b<<" "<<_c<<std::endl;
        }

    };
    Singleton* Singleton::_sint=nullptr;
}

int main()
{
    // hunger::Singleton::GetInstance().Print();
    lazy::Singleton::GetInstance()->Print();
    return 0;
}